package com.dy.design_pattern_study.abstract_factory_pattern.dome_abstract_factory;

import com.dy.design_pattern_study.abstract_factory_pattern.Department;
import com.dy.design_pattern_study.abstract_factory_pattern.User;
import com.dy.design_pattern_study.abstract_factory_pattern.dome_abstract_factory.IDB.IDepartment;
import com.dy.design_pattern_study.abstract_factory_pattern.dome_abstract_factory.IDB.IUser;
import com.dy.design_pattern_study.abstract_factory_pattern.dome_abstract_factory.factory.IFactory;
import com.dy.design_pattern_study.abstract_factory_pattern.dome_abstract_factory.factory.impl.sqlServer.SqlServerFactory;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-05
 * @Content
 * 利用工厂方法模式来解决 数据库更换问题
 * 抽象工厂模式（Abstract Factory），提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。
 * 抽象工厂就是工厂方法的升级版本 -指额外添加一个产品
 *  简单的说，抽象工厂模式就是在 工厂方法的基础上添加了多个系列产品
 *  工厂方法是 一个工厂只生产一个系列的产品（指产品接口）
 *  抽象工厂就是 一个工厂生产多个不同系列类型的产品（抽象工厂有多个产品接口）
 *
 *  优点：
 *  1.可以简单又快速的切换不同系列的产品
 *  2.在一个应用中只需要在初始化的时候出现一次，这就使得改变一个应用的具体工厂变得非常容易，
 *  它只需要改变具体工厂即可使用不同的产品配置。
 *  3.它让具体的创建实例过程与客户端分离，客户端是通过它们的抽象接口操纵实例，
 *  产品的具体类名也被具体工厂的实现分离，不会出现在客户代码中
 *
 *  缺点：
 *  如果需要添加对应的产品，则添加和修改多个类
 *  编程是门艺术，这样大批量的改动，显然是非常丑陋的做法
 *
 */
public class client {
    public static void main(String[] args) {
        User user = new User();

        //声明抽象工厂
        IFactory factory = new SqlServerFactory();
        //创建具体的产品种类
        IUser iu = factory.CreateUser();
        //生成不同类型的产品
        iu.Insert(user);
        iu.getUser(1);

        Department department = new Department();

        //创建具体的产品种类
        IDepartment idm = factory.CreateDepartment();
        //一个工厂可以有两种不同的产品
        idm.Insert(department);
        idm.getDepartment(1);
    }
}
